访问RDS PostgreSQL数据库

您可以参考本文提供的函数计算访问云数据库 RDS PostgreSQL 版的操作指导,在函数中配置VPC相关资源,然后配置数据库白名单,通过VPC实现数据的访问和操作。本文以Python 3为例,介绍如何使用Serverless Devs部署函数来访问云数据库 RDS PostgreSQL 版

前提条件

  • 快速创建RDS PostgreSQL实例

    重要
    • 请确保您所创建的数据库实例与需要访问该数据库实例的函数在同一地域。

    • 建议您在函数计算支持的可用区创建数据库实例。更多信息,请参见函数计算支持的可用区

      如果您的数据库实例不在函数计算支持的可用区内,可以通过在您的VPC环境中创建一个与函数计算相同可用区的vSwitch,并在函数的VPC配置中设置此vSwitch ID。由于同一VPC内不同vSwitch之间私网互通,因此函数计算可以通过该vSwitch访问在其他可用区的VPC内的资源。具体步骤,请参见遇到vSwitch is in unsupported zone的错误怎么办?

  • 创建名为COMPANY的表,并插入ID、NAME、AGE、ADDRESS和SALARY列。

    本文中index.py示例代码中的代码逻辑为向名为COMPANY的数据库表插入一条数据,表的Schema包含ID、NAME、AGE、ADDRESS和SALARY列。因此,需要提前创建该表与相应列。

操作步骤

  1. 安装Serverless Devs和Docker,并添加密钥信息。

  2. 执行以下命令初始化项目。

    sudo s init

    根据界面提示,依次选择阿里云厂商、快速创建模式和Python内置运行时,设置工程名称以及选择项目部署地域等,本文示例为在杭州地域下部署start-fc-postgresql-python项目。

  3. 执行以下命令进入项目。

    cd start-fc-postgresql-python
  4. 根据实际情况修改目录文件。

    • 编辑s.yaml文件,示例如下。

      edition: 3.0.0
      name: hello-world-app
      access: "default"
      
      vars: # 全局变量
        region: "cn-hangzhou"
      
      resources:
        hello_world:
          component: fc3 # 组件名称
          props:
            region: ${vars.region}              # 关于变量的使用方法,可以参考:https://docs.serverless-devs.com/serverless-devs/yaml#%E5%8F%98%E9%87%8F%E8%B5%8B%E5%80%BC
            functionName: "start-python-erhg"
            description: 'hello world by serverless devs'
            runtime: "python3.9"
            code: ./code
            handler: index.handler
            memorySize: 128
            timeout: 30
            internetAccess: true
            vpcConfig:
              vpcId: vpc-bp11y195luy47h8cm****  # 数据库实例所在的VPC ID
              securityGroupId: sg-bp1el3hto8hhkdup****  # 安全组ID
              vSwitchIds:
                - vsw-bp116uemmj7fniubi****  # 请确保该vSwitch对应的网段已配置到数据库实例访问白名单中
            environmentVariables:
              DATABASE: psql****
              HOST: pgm-bp1w1u08pc6m****.pg.rds.aliyuncs.com
              PORT: "5432"
              USER: z****
              PASSWORD: z****24
      重要

      请确保您为函数配置的交换机网段已添加到数据库实例访问白名单中。具体操作,请参见配置数据库IP访问白名单

    • 编辑index.py代码文件,示例如下,代码逻辑为向名称为COMPANY的数据库表中插入一条数据。

      # -*- coding: utf-8 -*-
      import logging
      import psycopg2   # 需先安装psycopg2库
      import os
      import sys
      logger = logging.getLogger()
      
      
      # 创建数据库连接
      def getConnection():
          try:
              conn = psycopg2.connect(
                  database=os.environ['DATABASE'],
                  user=os.environ['USER'],
                  password=os.environ['PASSWORD'],
                  host=os.environ['HOST'],
                  port=os.environ['PORT'],
              )
              return conn
          except Exception as e:
              logger.error(e)
              logger.error(
                  "ERROR: Unexpected error: Could not connect to PostgreSQL instance.")
              raise Exception(str(e))
      
      
      def handler(event, context):
          conn = getConnection()
          try:
              cur = conn.cursor()
              # 向COMPANY表中插入一行数据
              cur.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \
            VALUES (7, 'Paul', 32, 'California', 20000.00 )")
              conn.commit()
              return 'successfully'
          finally:
              # 关闭数据库链接
              conn.close()
              
  5. 执行以下命令构建项目。

    sudo s build --use-docker
  6. 执行以下命令部署项目。

    sudo s deploy -y
  7. 执行以下命令调用函数。

    sudo s invoke -e "{}"

    预期输出如下:

    ========= FC invoke Logs begin =========
    FunctionCompute python3 runtime inited.
    FC Invoke Start RequestId: 1-65d47954-1589bf20-c06837b09c3c
    FC Invoke End RequestId: 1-65d47954-1589bf20-c06837b09c3c
    
    Duration: 76.43 ms, Billed Duration: 77 ms, Memory Size: 128 MB, Max Memory Used: 12.83 MB
    ========= FC invoke Logs end =========
    
    Invoke instanceId: c-65d4794d-15f440b6-88291569b9e7
    Code Checksum: 2023398494764556055
    Qualifier: LATEST
    RequestId: 1-65d47954-1589bf20-c06837b09c3c
    
    Invoke Result:
    successfully
    ✔ [hello_world] completed (0.38s)

    执行成功后,您可以登录数据库查看刚才插入的数据。具体步骤,请参见连接PostgreSQL实例

    image

配置数据库IP访问白名单

重要

请使用设置IP地址白名单方式授权函数访问数据库,请勿使用安全组方式。否则,可能导致函数偶尔连接不上数据库的情况,影响业务正常运行。

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
  2. 在左侧导航栏单击白名单与安全组

    白名单设置页面,可查看当前的IP白名单模式。

    说明

    较早创建的实例可能采用高安全模式。新创建的实例都采用通用白名单模式。

  3. 在默认显示的白名单设置页签,找到default白名单分组,在其右侧,单击修改
  4. 修改白名单分组对话框,修改组内白名单,单击确定
    重要 此处填写的IP地址,需为在函数计算服务的网络配置中添加的vSwitch的IP段。

更多信息